package code07_面向对象;

/**
 * @author 黄衡熙
 * @version 1.0
 * @date 2025年07月21日13:51
 */
public class Test04_static关键字 {
    public static void main(String[] args) {
        SomeClass.name = "admin";   // 静态属性可以通过类访问
        // SomeClass.age = 18; // 实例属性不能通过类访问

        SomeClass sc = new SomeClass();
//        sc.name = "jack";
        SomeClass.name = "jack";
        sc.age = 20;
        // 此时访问sc.name结果是jack
//        System.out.println(sc.name);
        System.out.println(SomeClass.name);
        System.out.println(sc.age);
        System.out.println("**********************************");
        SomeClass sc2 = new SomeClass();
//        sc2.name = "tom";
        SomeClass.name = "tom";
        sc2.age = 22;
//        System.out.println(sc2.name);
        System.out.println(SomeClass.name);
        System.out.println(sc2.age);
        System.out.println("**********************************");
        // 此时访问sc.name发现结果是tom而不是jack
//        System.out.println(sc.name);
        System.out.println(SomeClass.name);
        System.out.println(sc.age);

        // 为了防止静态属性与实例属性在使用过程中产生误解
        // 因此,在实际开发中,所有的静态属性建议通过类名.属性名的方式访问
        // 而不建议通过对象.属性名的方式访问

        System.out.println("**********************************");
        sc.show();
        System.out.println("**********************************");
//        sc.print();
        SomeClass.print();


    }

}

class SomeClass {
    // 静态属性,属于类的,可以直接通过类名.属性名访问
    static String name;
    // 实例属性,属于对象的,必须通过对象.属性名访问
    int age;

    // 实例方法
    public void show() {
        System.out.println("实例方法");
        // 在实例方法中,可以正常访问静态属性与实例属性
        System.out.println(name);
        System.out.println(age);
    }

    // 静态方法
    public static void print() {
        System.out.println("静态方法");
        System.out.println(name);
        // 在静态方法中,只能访问静态属性,无法访问实例属性
        // System.out.println(age); 报错
    }

    public void show2() {
        System.out.println("实例方法");
        // 在实例方法中,可以调用示例方法,也可以调用静态方法
        show();
        print();
    }

    public static void print2() {
        System.out.println("静态方法");
        // 在静态方法中只能调用静态方法,无法调用实例方法
        // show(); 报错
        print();
    }
}
